到目前為止,我們的系統只會告訴我們「誰 (from
) 轉了多少錢 (value
) 給誰 (to
)」。這雖然是事實,但卻缺乏了最重要的「上下文 (Context)」。
試想一下,以下兩種告警,哪一種對你更有價值?
0xabc...
轉了 100 萬 USDC 到 0xdef...
🚨 交易所提幣!有 100 萬 USDC 從【Binance 14】轉出至一個【新錢包】!
答案顯而易見。第二種告警讓我們能立刻推斷出可能的市場意圖。這就是我們今天要達成的目標:讓 n8n 自動為交易貼上「語意標籤」。
我們的流程將進行一次小手術,將原本預計要放 AI 模型的位置,換成 n8n 的內建邏輯中樞 — Switch
節點。
本日工作流:Webhook
→ Code (準備與標記資料)
→ Switch (核心邏輯判斷)
→ 多個 Discord (客製化通知)
Code
節點 (賦予它記憶力)這個節點是我們系統的「記憶中樞」。我們將在這裡建立一個「地址標籤庫」,讓 n8n 認識幣圈的各大交易所與 DeFi 協議。
Webhook
節點後方,確保連接的是一個 Code
節點。Code
節點中,覆蓋掉所有舊內容。// 獲取 Webhook 節點傳來的完整資料
const allData = $input.all();
// 我們假設 Webhook 一次只會觸發一筆資料,所以直接取第一筆
const item = allData[0];
// --- 1. 資料解析與標準化 (防呆設計) ---
// 從複雜的 Webhook 結構中,安全地取出我們需要的交易資訊
const activity = item.json.event?.activity?.[0] || {};
const tx = {
from: activity.fromAddress || '未知地址',
to: activity.toAddress || '未知地址',
value: parseFloat(activity.value) || 0,
asset: activity.asset || '未知代幣',
hash: activity.hash || 'N/A',
};
// --- 2. 地址標籤庫 (你的智慧核心) ---
// 你可以不斷擴充這個列表,讓你的機器人認識更多地址
const knownAddresses = {
// === 交易所 ===
"0x28c6c06298d514db089934071355e5743bf21d60": "Binance 14",
"0xf977814e90da44bfa03b6295a0616a897441acec": "Binance 8",
"0x503828976d22510aad0201ac792873a52524375a": "Coinbase 10",
// === DeFi 協議 ===
"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45": "Uniswap V3 Router",
"0x7a250d5630b4cf539739df2c5dacb4c659f2488d": "Uniswap V2 Router",
"0x1111111254fb6c44bac0bed2854e76f90643097d": "1inch v5 Router",
// === 基礎代幣 ===
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": "Wrapped Ether (WETH)"
};
// --- 3. 賦予交易「語意標籤」---
// 將 from 和 to 地址轉換為我們看得懂的標籤
// .toLowerCase() 是為了確保比對時,不受地址大小寫差異影響
item.json.fromTag = knownAddresses[tx.from.toLowerCase()] || "未知錢包";
item.json.toTag = knownAddresses[tx.to.toLowerCase()] || "未知錢包";
// 為了讓後續節點能直接使用標準化後的乾淨數據,我們把 tx 物件也加到輸出中
item.json.tx = tx;
// 最後,將這筆被我們「加工」過的資料回傳,給下一個節點 (Switch) 使用
return item;
完成後,這個節點的輸出資料中,就會多出 fromTag
和 toTag
這兩個我們人工加上的「語意標籤」。
Switch
節點 (擔任判斷大腦)這是取代 AI 的核心步驟,我們要用它來實現智慧分流。
Code
節點後方,新增一個 Switch
節點。Switch
節點,開始設定我們的「路由規則 (Routing Rules)」。我們的目標是建立 3 個主要分支:輸出索引 | 分支名稱 (自訂) | 規則設定 (條件) |
---|---|---|
0 | 交易所充幣 | {{ $json.toTag }} - Contains - Binance |
1 | 交易所提幣 | {{ $json.fromTag }} - Contains - Binance |
2 | DeFi 互動 | {{ $json.toTag }} - Contains - Uniswap |
Property
欄位填入我們要判斷的變數,例如 {{ $json.toTag }}
。Operation
欄位選擇判斷方式,例如 Contains
(包含)。Value
欄位填入我們要比對的文字,例如 Binance
。現在,最有趣的部分來了!我們要讓機器人根據不同情境,說出不同語氣的話。
從 Switch
節點的輸出點 0 (交易所充幣) 拉一條線,連接到一個新的 Discord
節點。設定訊息內容:
📈 資金流入交易所!{{ $json.tx.asset }} 已從 {{ $json.fromTag }} 轉入 {{ $json.toTag }}。金額:{{ $json.tx.value.toLocaleString('en-US') }}[查看交易詳情](https://etherscan.io/tx/{{ $json.tx.hash }})
從 Switch
節點的輸出點 1 (交易所提幣) 拉一條線,連接到第二個 Discord
節點。設定訊息內容:
🚨 注意!大額資金提幣!{{ $json.tx.asset }} 已從 {{ $json.fromTag }} 提出至 {{ $json.toTag }}!金額:{{ $json.tx.value.toLocaleString('en-US') }}[查看交易詳情](https://etherscan.io/tx/{{ $json.tx.hash }})
從 Switch
節點的輸出點 2 (DeFi 互動) 拉一條線,連接到第三個 Discord
節點。設定訊息內容:
⚛️ DeFi 協議互動有一筆關於 {{ $json.tx.asset }} 的操作發生在 {{ $json.toTag }}。金額:{{ $json.tx.value.toLocaleString('en-US') }}[查看交易詳情](https://etherscan.io/tx/{{ $json.tx.hash }})
你可以選擇性地從 Switch
節點的 Default 輸出點,再接一個 Discord
節點,用來處理所有其他類型的「一般轉帳」。
恭喜你!今天我們完成了一次非常實用的「技術轉向」。我們證明了,在追求自動化的道路上,不一定總是需要最複雜、最昂貴的工具。有時候,回歸工具本身,善用其內建的強大邏輯,反而能打造出更穩定、快速、且零成本的解決方案。
透過 Code
節點的資料預處理和 Switch
節點的邏輯分流,我們的巨鯨告警系統,已經從一個只會「報數」的機器,進化成一個能初步「分類情境」的智慧助理。